home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
termsorc.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LTP_DrawGauge.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-24
|
7KB
|
267 lines
/* GadTools layout toolkit
**
** Copyright © 1993-1995 by Olaf `Olsen' Barthel
** Freely distributable.
*/
#include "gtlayout_global.h"
#ifdef DO_GAUGE_KIND
VOID __regargs
LTP_DrawTick(LayoutHandle *Handle,ObjectNode *Node,WORD Left,WORD Top)
{
struct RastPort *rp = &Handle -> RPort;
Left += Node -> Left;
LTP_SetAPen(rp,Handle -> ShadowPen);
Move(rp,Left,Top);
Draw(rp,Left,Top + 1);
LTP_SetAPen(rp,Handle -> ShinePen);
Move(rp,Left + 1,Top);
Draw(rp,Left + 1,Top + 1);
}
VOID __regargs
LTP_DrawGauge(LayoutHandle *handle,ObjectNode *node,LONG percent,BOOLEAN fullRefresh)
{
struct RastPort *rp = &handle -> RPort;
LONG height = node -> Height - (1 + 1);
LONG width = node -> Width - (2 + 2);
BOOLEAN continuous;
if(fullRefresh)
{
EraseRect(rp,node -> Left,node -> Top,node -> Left + node -> Width - 1,node -> Top + node -> Height - 1);
if(node -> Special . Gauge . NoTicks)
{
DrawBevelBox(rp,node -> Left,node -> Top,node -> Width,node -> Height,
GT_VisualInfo, handle -> VisualInfo,
GTBB_Recessed, TRUE,
TAG_DONE);
}
else
{
LONG top = node -> Top + node -> Height - (handle -> RPort . TxHeight + 2);
DrawBevelBox(rp,node -> Left,node -> Top,node -> Width,node -> Height - (handle -> InterHeight + handle -> RPort . TxHeight + 2),
GT_VisualInfo, handle -> VisualInfo,
GTBB_Recessed, TRUE,
TAG_DONE);
LTP_SetPens(rp,handle -> TextPen,0,JAM1);
LTP_PlaceText(handle,"0%",2,node -> Left,top + handle -> RPort . TxBaseline);
LTP_PlaceText(handle,"100%",4,node -> Left + node -> Width - TextLength(rp,"100%",4),top + handle -> RPort . TxBaseline);
if(node -> Width >= TextLength(rp,"0%50%100%",9) + 4 * handle -> GlyphWidth)
{
LONG i,left,total = node -> Width - 2;
LTP_PlaceText(handle,"50%",3,node -> Left + (node -> Width - TextLength(rp,"50%",3)) / 2,top + handle -> RPort . TxBaseline);
top -= handle -> InterHeight;
for (i = 0 ; i < 5 ; i++)
{
left = (total * i) / 4;
LTP_DrawTick(handle,node,left,top);
}
}
else
{
LONG i,left,total = node -> Width - 2;
top -= handle -> InterHeight;
for (i = 0; i < 3; i++)
{
left = (total * i) / 2;
LTP_DrawTick(handle,node,left,top);
}
}
}
}
if(node -> Special . Gauge . Discrete)
{
if(width < 60)
continuous = TRUE;
else
continuous = FALSE;
}
else
continuous = TRUE;
if(!node -> Special . Gauge . NoTicks)
height -= handle -> InterHeight + handle -> RPort . TxHeight + 2;
if(node -> Special . Gauge . InfoLength && node -> Special . Gauge . InfoText[0])
{
struct TextExtent Extent;
LONG len;
LONG left;
LONG right;
left = 0;
if(continuous)
{
right = (width * percent) / 100;
if(right)
{
LTP_SetAPen(rp,handle -> DrawInfo -> dri_Pens[FILLPEN]);
RectFill(rp,node -> Left + 2 + left,node -> Top + 1,node -> Left + 2 + right - 1,node -> Top + 1 + height - 1);
}
}
else
{
LONG count;
right = 0;
if(count = (10 * percent) / 100)
{
LONG chunk = width / 10,i;
UWORD fillPen = handle -> DrawInfo -> dri_Pens[FILLPEN];
UWORD backPen = handle -> BackgroundPen;
for(i = 0 ; i < count ; i++)
{
LTP_SetAPen(rp,fillPen);
RectFill(rp,node -> Left + 2 + left,node -> Top + 1,node -> Left + 2 + left + (chunk - 1) - 1,node -> Top + 1 + height - 1);
left += chunk;
right += chunk;
LTP_SetAPen(rp,backPen);
RectFill(rp,node -> Left + 2 + right - 1,node -> Top + 1,node -> Left + 2 + right - 1,node -> Top + 1 + height - 1);
}
}
}
if(right < width)
{
left = right;
right = width;
LTP_SetAPen(rp,handle -> BackgroundPen);
RectFill(rp,node -> Left + 2 + left,node -> Top + 1,node -> Left + 2 + right - 1,node -> Top + 1 + height - 1);
}
if(handle -> DrawInfo -> dri_Pens[FILLTEXTPEN] == handle -> DrawInfo -> dri_Pens[BACKGROUNDPEN])
{
if(handle -> DrawInfo -> dri_Pens[TEXTPEN] == handle -> DrawInfo -> dri_Pens[FILLPEN])
LTP_SetPens(rp,handle -> DrawInfo -> dri_Pens[TEXTPEN],handle -> BackgroundPen,JAM1 | COMPLEMENT);
else
LTP_SetPens(rp,handle -> DrawInfo -> dri_Pens[TEXTPEN],handle -> BackgroundPen,JAM1);
}
else
{
if(handle -> DrawInfo -> dri_Pens[FILLTEXTPEN] == handle -> DrawInfo -> dri_Pens[FILLPEN])
LTP_SetPens(rp,handle -> DrawInfo -> dri_Pens[FILLTEXTPEN],handle -> BackgroundPen,JAM1 | COMPLEMENT);
else
LTP_SetPens(rp,handle -> DrawInfo -> dri_Pens[FILLTEXTPEN],handle -> BackgroundPen,JAM1);
}
len = TextFit(rp,node -> Special . Gauge . InfoText,strlen(node -> Special . Gauge . InfoText),&Extent,NULL,1,width,32767);
LTP_PlaceText(handle,node -> Special . Gauge . InfoText,len,node -> Left + 2 + (width - Extent . te_Width) / 2,node -> Top + 1 + (height - rp -> Font -> tf_YSize) / 2 + rp -> Font -> tf_Baseline);
LTP_SetPens(rp,handle -> TextPen,handle->BackgroundPen,JAM1);
}
else
{
LONG left,right;
if(continuous)
{
if(node -> Current < percent)
{
left = (width * node -> Current) / 100;
right = (width * percent) / 100;
if(right)
{
LTP_SetAPen(rp,handle -> DrawInfo -> dri_Pens[FILLPEN]);
RectFill(rp,node -> Left + 2 + left,node -> Top + 1,node -> Left + 2 + right - 1,node -> Top + 1 + height - 1);
}
}
else
{
if(node -> Current > percent)
{
left = (width * percent) / 100;
right = (width * node -> Current) / 100;
if(right)
{
LTP_SetAPen(rp,handle -> BackgroundPen);
RectFill(rp,node -> Left + 2 + left,node -> Top + 1,node -> Left + 2 + right - 1,node -> Top + 1 + height - 1);
}
}
}
}
else
{
LONG count;
count = (10 * percent) / 100;
if(!fullRefresh && count == node -> Special . Gauge . LastPercentage)
{
node -> Current = percent;
LTP_PutStorage(node);
return;
}
node -> Special . Gauge . LastPercentage = count;
right = 0;
if(count)
{
LONG chunk = width / 10,i;
UWORD fillPen = handle -> DrawInfo -> dri_Pens[FILLPEN];
UWORD backPen = handle -> BackgroundPen;
left = 0;
for(i = 0 ; i < count ; i++)
{
LTP_SetAPen(rp,fillPen);
RectFill(rp,node -> Left + 2 + left,node -> Top + 1,node -> Left + 2 + left + (chunk - 1) - 1,node -> Top + 1 + height - 1);
left += chunk;
right += chunk;
LTP_SetAPen(rp,backPen);
RectFill(rp,node -> Left + 2 + right - 1,node -> Top + 1,node -> Left + 2 + right - 1,node -> Top + 1 + height - 1);
}
}
if(right < width)
{
left = right;
right = width;
LTP_SetAPen(rp,handle -> BackgroundPen);
RectFill(rp,node -> Left + 2 + left,node -> Top + 1,node -> Left + 2 + right - 1,node -> Top + 1 + height - 1);
}
}
}
node -> Current = percent;
LTP_PutStorage(node);
}
#endif